# -*-coding:utf-8-*-
import types, collections.abc as collection

def f():
    ...

class A:
    ...

class C(A):
    ...

"""
python中一切皆对象,对象分为类型对象(int,function,method,object等内置对象和自定义的class对象)和
非类型对象([],"a",定义的函数def,自定义class对象的实例等),可以说非类型对象就是类型对象的实例.在python3中类和类型是同一样东西.

对象都有它的类型,非类型对象的类型是实例化出它们的类型对象,类型对象的类型是type(比如def a()的类型是<class 'function'>;1的类型是<class 'int'>;
定义一个类A,A就是一种类型,即A的类型是<class 'type'>,而A的实例A()的类型就是<class 'A'>).

object的类型是type,type是object的子类,isinstance(object, type)和isinstance(type, object)都为True,
type(object) == type(type) == <class 'type'>.

isinstance(o, classinfo):如果o是classinfo类型对象的实例,或者o是classinfo类型对象的子类的实例,返回True.
type(object):返回对象的类型
isinstance()与type()区别：
type()不会认为子类是一种父类类型,不考虑继承关系.
isinstance()会认为子类是一种父类类型,考虑继承关系.
如果要判断两个类型是否相同推荐使用isinstance()
"""
c = C()
print(type(1) == int)  # True
print((type(c) is C))  # True, 比较时用==和is都可以
print((type(c) is A))  # False
print(type(c))  # <class '__main__.C'>
print(type(C))  # <class 'type'>,类C是一种类型,所以C的类型是type

print(isinstance(1, int))  # True
print(isinstance(c, C))  # True
print(isinstance(c, A))  # True
print(isinstance(C, A))  # False,isinstance()不是判断类的继承关系,issubclass(C, A)为True
print(isinstance([], collection.Iterable))  # True
print(isinstance(f, types.FunctionType))  # True,types.xxxType返回的是对象类型
print(isinstance(object, type))  # True
print(isinstance(type, object))  # True,isinstance(任意对象, object)都为True(因为任意对象的类型都是object的子类)